/**
 * @class button - insert/edit link (open dialog window)
 *
 * @param  elRTE  rte   объект-редактор
 * @param  String name  название кнопки
 *
 * @author:    Dmitry Levashov (dio) dio@std42.ru
 * Copyright: Studio 42, http://www.std42.ru
 **/
(function ($) {
    elRTE.prototype.ui.prototype.buttons.link = function (rte, name) {
        this.constructor.prototype.constructor.call(this, rte, name);
        var self = this;
        this.img = false;

        this.bm;

        function init() {
            self.labels = {
                id:'ID',
                'class':'Css class',
                style:'Css style',
                dir:'Script direction',
                lang:'Language',
                charset:'Charset',
                type:'Target MIME type',
                rel:'Relationship page to target (rel)',
                rev:'Relationship target to page (rev)',
                tabindex:'Tab index',
                accesskey:'Access key'
            }
            self.src = {
                main:{
                    href:$('<input type="text" />'),
                    title:$('<input type="text" />'),
                    anchor:$('<select />').attr('name', 'anchor'),
                    target:$('<select />')
                        .append($('<option />').text(self.rte.i18n('In this window')).val(''))
                        .append($('<option />').text(self.rte.i18n('In new window (_blank)')).val('_blank'))
                    // 	.append($('<option />').text(self.rte.i18n('In new parent window (_parent)')).val('_parent'))
                    // 	.append($('<option />').text(self.rte.i18n('In top frame (_top)')).val('_top'))
                },

                popup:{
                    use:$('<input type="checkbox" />'),
                    url:$('<input type="text" />').val('http://'),
                    name:$('<input type="text" />'),
                    width:$('<input type="text" />').attr({size:6, title:self.rte.i18n('Width')}).css('text-align', 'right'),
                    height:$('<input type="text" />').attr({size:6, title:self.rte.i18n('Height')}).css('text-align', 'right'),
                    left:$('<input type="text" />').attr({size:6, title:self.rte.i18n('Left')}).css('text-align', 'right'),
                    top:$('<input type="text" />').attr({size:6, title:self.rte.i18n('Top')}).css('text-align', 'right'),
                    location:$('<input type="checkbox" />'),
                    menubar:$('<input type="checkbox" />'),
                    toolbar:$('<input type="checkbox" />'),
                    scrollbars:$('<input type="checkbox" />'),
                    status:$('<input type="checkbox" />'),
                    resizable:$('<input type="checkbox" />'),
                    dependent:$('<input type="checkbox" />'),
                    retfalse:$('<input type="checkbox" />').attr('checked', true)
                },

                adv:{
                    id:$('<input type="text" />'),
                    'class':$('<input type="text" />'),
                    style:$('<input type="text" />'),
                    dir:$('<select />')
                        .append($('<option />').text(self.rte.i18n('Not set')).val(''))
                        .append($('<option />').text(self.rte.i18n('Left to right')).val('ltr'))
                        .append($('<option />').text(self.rte.i18n('Right to left')).val('rtl')),
                    lang:$('<input type="text" />'),
                    charset:$('<input type="text" />'),
                    type:$('<input type="text" />'),
                    rel:$('<input type="text" />'),
                    rev:$('<input type="text" />'),
                    tabindex:$('<input type="text" />'),
                    accesskey:$('<input type="text" />')
                },
                events:{}
            }

            $.each(
                ['onblur', 'onfocus', 'onclick', 'ondblclick', 'onmousedown', 'onmouseup', 'onmouseover', 'onmouseout', 'onmouseleave', 'onkeydown', 'onkeypress', 'onkeyup'],
                function () {
                    self.src.events[this] = $('<input type="text" />');
                });

            $.each(self.src, function () {
                for (var n in this) {
                    // this[n].attr('name', n);
                    var t = this[n].attr('type');
                    if (!t || (t == 'text' && !this[n].attr('size'))) {
                        this[n].css('width', '100%');
                    }
                }
            });

        }

        this.command = function () {
            var n = this.rte.selection.getNode(),
                sel, i, v, opts, l, r, link, href, s;

            !this.src && init();
            // this.rte.selection.saveIERange();

            this.bm = this.rte.selection.getBookmark();

            function isLink(n) {
                return n.nodeName == 'A' && n.href;
            }

            this.link = this.rte.dom.selfOrParentLink(n);

            if (!this.link) {
                sel = this.rte.selection.selected({wrap:false});
                if (sel.length) {
                    for (i = 0; i < sel.length; i++) {
                        if (isLink(sel[i])) {
                            this.link = sel[i];
                            break;
                        }
                    }
                    ;
                    if (!this.link) {
                        this.link = this.rte.dom.parent(sel[0], isLink) || this.rte.dom.parent(sel[sel.length - 1], isLink);
                    }
                }
            }

            this.link = this.link ? $(this.link) : $(this.rte.doc.createElement('a'));
            this.img = n.nodeName == 'IMG' ? n : null;
            this.updatePopup();

            this.src.main.anchor.empty();
            $('a[href!=""][name]', this.rte.doc).each(function () {
                var n = $(this).attr('name');
                self.src.main.anchor.append($('<option />').val(n).text(n));
            });
            if (this.src.main.anchor.children().length) {
                this.src.main.anchor.prepend($('<option />').val('').text(this.rte.i18n('Select bookmark')))
                    .change(function () {
                        var v = $(this).val();
                        if (v) {
                            self.src.main.href.val('#' + v);
                        }
                    });
            }

            opts = {
                rtl:this.rte.rtl,
                submit:function (e, d) {
                    e.stopPropagation();
                    e.preventDefault();
                    self.set();
                    d.close();
                },
                tabs:{ show:function (e, ui) {
                    if (ui.index == 3) {
                        self.updateOnclick();
                    }
                } },
                close:function () {
//                    self.rte.browser.msie && self.rte.selection.restoreIERange();
                },
                dialog:{
                    width:'auto',
                    width:430,
                    title:this.rte.i18n('Link')

                }
            }

            d = new elDialogForm(opts);

            l = $('<div />')
                .append($('<label />').append(this.src.popup.location).append(this.rte.i18n('Location bar')))
                .append($('<label />').append(this.src.popup.menubar).append(this.rte.i18n('Menu bar')))
                .append($('<label />').append(this.src.popup.toolbar).append(this.rte.i18n('Toolbar')))
                .append($('<label />').append(this.src.popup.scrollbars).append(this.rte.i18n('Scrollbars')));
            r = $('<div />')
                .append($('<label />').append(this.src.popup.status).append(this.rte.i18n('Status bar')))
                .append($('<label />').append(this.src.popup.resizable).append(this.rte.i18n('Resizable')))
                .append($('<label />').append(this.src.popup.dependent).append(this.rte.i18n('Depedent')))
                .append($('<label />').append(this.src.popup.retfalse).append(this.rte.i18n('Add return false')));

            d.tab('main', this.rte.i18n('Properies'))
                .tab('popup', this.rte.i18n('Popup'))
                .tab('adv', this.rte.i18n('Advanced'))
                .tab('events', this.rte.i18n('Events'))
                .append($('<label />').append(this.src.popup.use).append(this.rte.i18n('Open link in popup window')), 'popup')
                .separator('popup')
                .append([this.rte.i18n('URL'), this.src.popup.url], 'popup', true)
                .append([this.rte.i18n('Window name'), this.src.popup.name], 'popup', true)
                .append([this.rte.i18n('Window size'), $('<span />').append(this.src.popup.width).append(' x ').append(this.src.popup.height).append(' px')], 'popup', true)
                .append([this.rte.i18n('Window position'), $('<span />').append(this.src.popup.left).append(' x ').append(this.src.popup.top).append(' px')], 'popup', true)
                .separator('popup')
                .append([l, r], 'popup', true);

            link = this.link.get(0);
            href = this.rte.dom.attr(link, 'href');
            this.src.main.href.val(href).change(function () {
                $(this).val(self.rte.utils.absoluteURL($(this).val()));
            });

            if (this.rte.options.fmAllow && this.rte.options.fmOpen) {
                var s = $('<span />').append(this.src.main.href.css('width', '87%'))
                    .append(
                    $('<span />').addClass('ui-state-default ui-corner-all')
                        .css({'float':'right', 'margin-right':'3px'})
                        .attr('title', self.rte.i18n('Open file manger'))
                        .append($('<span />').addClass('ui-icon ui-icon-folder-open'))
                        .click(function () {
                            self.rte.options.fmOpen(function (url) {
                                self.src.main.href.val(url).change();
                            });
                        })
                        .hover(function () {
                            $(this).addClass('ui-state-hover')
                        }, function () {
                            $(this).removeClass('ui-state-hover')
                        })
                );
                d.append([this.rte.i18n('Link URL'), s], 'main', true);
            } else {
                d.append([this.rte.i18n('Link URL'), this.src.main.href], 'main', true);
            }
            this.src.main.href.change();

            d.append([this.rte.i18n('Title'), this.src.main.title.val(this.rte.dom.attr(link, 'title'))], 'main', true);
            if (this.src.main.anchor.children().length) {
                d.append([this.rte.i18n('Bookmark'), this.src.main.anchor.val(href)], 'main', true)
            }
            if (!(this.rte.options.doctype.match(/xhtml/) && this.rte.options.doctype.match(/strict/))) {
                d.append([this.rte.i18n('Target'), this.src.main.target.val(this.link.attr('target') || '')], 'main', true);
            }


            for (var n in this.src.adv) {
                this.src.adv[n].val(this.rte.dom.attr(link, n));
                d.append([this.rte.i18n(this.labels[n] ? this.labels[n] : n), this.src.adv[n]], 'adv', true);
            }
            for (var n in this.src.events) {
                var v = this.rte.utils.trimEventCallback(this.rte.dom.attr(link, n));
                this.src.events[n].val(v);
                d.append([this.rte.i18n(this.labels[n] ? this.labels[n] : n), this.src.events[n]], 'events', true);
            }

            this.src.popup.use.change(function () {
                var c = $(this).attr('checked');
                $.each(self.src.popup, function () {
                    if ($(this).attr('name') != 'use') {
                        if (c) {
                            $(this).removeAttr('disabled');
                        } else {
                            $(this).attr('disabled', true);
                        }
                    }
                })
            });
            this.src.popup.use.change();

            d.open();
        }

        this.update = function () {
            var n = this.rte.selection.getNode();

            // var t = this.rte.dom.selectionHas(function(n) { return n.nodeName == 'A' && n.href; });
            // this.rte.log(t)

            if (this.rte.dom.selfOrParentLink(n)) {
                this.domElem.removeClass('disabled').addClass('active');
            } else if (this.rte.dom.selectionHas(function (n) {
                return n.nodeName == 'A' && n.href;
            })) {
                this.domElem.removeClass('disabled').addClass('active');
            } else if (!this.rte.selection.collapsed() || n.nodeName == 'IMG') {
                this.domElem.removeClass('disabled active');
            } else {
                this.domElem.addClass('disabled').removeClass('active');
            }
        }

        this.updatePopup = function () {
            var onclick = '' + this.link.attr('onclick');
            // onclick = onclick ? $.trim(onclick.toString()) : ''
            if (onclick.length > 0 && (m = onclick.match(/window.open\('([^']+)',\s*'([^']*)',\s*'([^']*)'\s*.*\);\s*(return\s+false)?/))) {
                this.src.popup.use.attr('checked', 'on')
                this.src.popup.url.val(m[1]);
                this.src.popup.name.val(m[2]);

                if (/location=yes/.test(m[3])) {
                    this.src.popup.location.attr('checked', true);
                }
                if (/menubar=yes/.test(m[3])) {
                    this.src.popup.menubar.attr('checked', true);
                }
                if (/toolbar=yes/.test(m[3])) {
                    this.src.popup.toolbar.attr('checked', true);
                }
                if (/scrollbars=yes/.test(m[3])) {
                    this.src.popup.scrollbars.attr('checked', true);
                }
                if (/status=yes/.test(m[3])) {
                    this.src.popup.status.attr('checked', true);
                }
                if (/resizable=yes/.test(m[3])) {
                    this.src.popup.resizable.attr('checked', true);
                }
                if (/dependent=yes/.test(m[3])) {
                    this.src.popup.dependent.attr('checked', true);
                }
                if ((_m = m[3].match(/width=([^,]+)/))) {
                    this.src.popup.width.val(_m[1]);
                }
                if ((_m = m[3].match(/height=([^,]+)/))) {
                    this.src.popup.height.val(_m[1]);
                }
                if ((_m = m[3].match(/left=([^,]+)/))) {
                    this.src.popup.left.val(_m[1]);
                }
                if ((_m = m[3].match(/top=([^,]+)/))) {
                    this.src.popup.top.val(_m[1]);
                }
                if (m[4]) {
                    this.src.popup.retfalse.attr('checked', true);
                }
            } else {
                $.each(this.src.popup, function () {
                    var $this = $(this);
                    if ($this.attr('type') == 'text') {
                        $this.val($this.attr('name') == 'url' ? 'http://' : '');
                    } else {
                        if ($this.attr('name') == 'retfalse') {
                            this.attr('checked', true);
                        } else {
                            $this.removeAttr('checked');
                        }
                    }
                });
            }

        }

        this.updateOnclick = function () {
            var url = this.src.popup.url.val();
            if (this.src.popup.use.attr('checked') && url) {
                var params = '';
                if (this.src.popup.location.attr('checked')) {
                    params += 'location=yes,';
                }
                if (this.src.popup.menubar.attr('checked')) {
                    params += 'menubar=yes,';
                }
                if (this.src.popup.toolbar.attr('checked')) {
                    params += 'toolbar=yes,';
                }
                if (this.src.popup.scrollbars.attr('checked')) {
                    params += 'scrollbars=yes,';
                }
                if (this.src.popup.status.attr('checked')) {
                    params += 'status=yes,';
                }
                if (this.src.popup.resizable.attr('checked')) {
                    params += 'resizable=yes,';
                }
                if (this.src.popup.dependent.attr('checked')) {
                    params += 'dependent=yes,';
                }
                if (this.src.popup.width.val()) {
                    params += 'width=' + this.src.popup.width.val() + ',';
                }
                if (this.src.popup.height.val()) {
                    params += 'height=' + this.src.popup.height.val() + ',';
                }
                if (this.src.popup.left.val()) {
                    params += 'left=' + this.src.popup.left.val() + ',';
                }
                if (this.src.popup.top.val()) {
                    params += 'top=' + this.src.popup.top.val() + ',';
                }
                if (params.length > 0) {
                    params = params.substring(0, params.length - 1)
                }
                var retfalse = this.src.popup.retfalse.attr('checked') ? 'return false;' : '';
                var onclick = "window.open('" + url + "', '" + $.trim(this.src.popup.name.val()) + "', '" + params + "'); " + retfalse;
                this.src.events.onclick.val(onclick);
                if (!this.src.main.href.val()) {
                    this.src.main.href.val('#');
                }
            } else {
                var v = this.src.events.onclick.val();
                v = v.replace(/window\.open\([^\)]+\)\s*;?\s*return\s*false\s*;?/i, '');
                this.src.events.onclick.val(v);
            }
        }

        this.set = function () {
            var href, fakeURL;
            this.updateOnclick();
            this.rte.selection.moveToBookmark(this.bm);
            // this.rte.selection.restoreIERange();
            this.rte.history.add();
            href = this.rte.utils.absoluteURL(this.src.main.href.val());
            if (!href) {
                // this.link.parentNode && this.rte.doc.execCommand('unlink', false, null);
                var bm = this.rte.selection.getBookmark();
                this.rte.dom.unwrap(this.link[0]);
                this.rte.selection.moveToBookmark(bm);

            } else {
                if (this.img && this.img.parentNode) {
                    this.link = $(this.rte.dom.create('a')).attr('href', href);
                    this.rte.dom.wrap(this.img, this.link[0]);
                } else if (!this.link[0].parentNode) {
                    fakeURL = '#--el-editor---' + Math.random();
                    this.rte.doc.execCommand('createLink', false, fakeURL);
                    this.link = $('a[href="' + fakeURL + '"]', this.rte.doc);
                    this.link.each(function () {
                        var $this = $(this);

                        // удаляем ссылки вокруг пустых элементов
                        if (!$.trim($this.html()) && !$.trim($this.text())) {
                            $this.replaceWith($this.text()); //  сохраняем пробелы :)
                        }
                    });
                }

                this.src.main.href.val(href);
                for (var tab in this.src) {
                    if (tab != 'popup') {
                        for (var n in this.src[tab]) {
                            if (n != 'anchors') {
                                var v = $.trim(this.src[tab][n].val());
                                if (v) {
                                    this.link.attr(n, v);
                                } else {
                                    this.link.removeAttr(n);
                                }
                            }
                        }
                    }
                }
                ;


                this.img && this.rte.selection.select(this.img);
            }
            this.rte.ui.update(true);
        }

    }

})(jQuery);
